#ifndef GENRE_H
#define GENRE_H

#include "../abstract/abstractdata.h"
#include "../database/dbgenre.h"
#include <QString>
#include <QHash>
#include <QDebug>

class DtTrack;
class DtAlbum;
class DtArtist;

class DtGenre : public AbstractData
{
private:
    QList<DtTrack *> lTrack;
    QList<DtAlbum *> lAlbum;
    QList<DtArtist *> lArtist;
public:
    enum {
        Play = 0,
        Add = 1,
        Name = 2,
        Heart = 3,

        NbAttr
    };
    DtGenre();
    DtGenre(const QString &name, const int id = -1);
    DtGenre(const DtGenre &genre);
    virtual ~DtGenre();
    /**
     * @brief operator << is use for the debbugging with Qt. See the Qt Doc to
     *find more help on this function
     * @param dbg the stream of debugging
     * @param artist the artist to show
     * @return
     */
    friend QDebug operator<<(QDebug dbg, const DtGenre &genre);

    static DtGenre * findById(QList<DtGenre> &sGenre, const int id);

    /*!
     * \brief Lorsque l'utilisateur clique sur une colonne une action est lancée
     *
     * Méthode de gestion d'action sur le tableau. Elle permet d'effectuer
     *l'action adéquate pour la case
     * \param section : Le numéro de la colonne
     */
    void clicked(const int section);

    QList<DtTrack *> &getTracks();
    QList<DtAlbum *> &getAlbums();
    QList<DtArtist *> &getArtists();

    void addTrack(DtTrack *track);
    void addAlbum(DtAlbum *album);
    void addArtist(DtArtist *artist);
};

/**
 * @brief operator == is use for the QSet container.
 * @param genre1
 * @param genre2
 * @return
 */
inline bool operator==(const DtGenre &genre1, const DtGenre &genre2)
{
    return (genre1.getName().toUpper() == genre2.getName().toUpper());
}

/**
 * @brief qHash is use for the QSet container too
 * @param genre
 * @return
 */
inline uint qHash(const DtGenre & genre)
{
    return qHash(genre.getName().toUpper());
}

#endif // GENRE_H
